Java 필터에 서비스를 주입하는 방법

巴扎黑
풀어 주다: 2016-11-26 09:10:38
원래의
1828명이 탐색했습니다.

프로젝트에서 문제가 발생했습니다. 필터에 서비스를 주입하는 데 실패했고 주입된 서비스가 항상 null이었습니다. 아래와 같이:

public class WeiXinFilter Implements Filter{
@Autowired
private UsersService usersService;

public void doFilter(ServletRequest 요청, ServletResponse 응답, FilterChain 체인)은 IOException, ServletException을 발생시킵니다. {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
Users users = this.usersService.queryBy Openid(openid);
}

위의 usersService는 널 포인터 예외를 보고합니다.

해결책 1:

public void doFilter(ServletRequest 요청, ServletResponse 응답, FilterChain 체인) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request ;
HttpServletResponse resp = (HttpServletResponse)response; ServletContext sc = req.getSession().getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.
                                                            != null && cxt.getBean ("usersService") != null && usersService == null)
usersService = (UsersService) cxt.getBean("usersService");

사용자 사용자 = this.usersService .queryByOpenid(openid);

그렇습니다.

방법 2:

공용 클래스 WeiXinFilter가 필터를 구현함{

private UsersService usersService
public void init(FilterConfig fConfig)가 ServletException 발생 {
ServletContext sc = fConfig.getServletContext()
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc) ) != null && usersService == null)
usersService = (UsersService) cxt.getBean("usersService" ); ServletContext 가져오기:

1) javax.servlet.Filter context에서 직접 ServletContext 가져오기 = config.getServletContext();

2) HttpServlet에서 직접 가져오기

getServletContext()

3) 다른 방법으로는 HttpServletRequest

request.getSession().getServletContext();

를 통해 가져옵니다.

2. blessht.iteye.com/blog/2121845):

Spring의 ContextLoaderListener는 ServletContextListener 인터페이스를 구현하는 리스너입니다. 프로젝트를 시작할 때 contextInitialized 메소드가 트리거됩니다(이 메소드는 주로 ApplicationContext 객체 생성을 완료합니다). . contextDestroyed 메소드는 프로젝트가 닫힐 때 트리거됩니다(이 메소드는 ApplicationContext 정리 작업을 수행합니다).

ConextLoaderListener에 의한 Spring 컨텍스트 로드 프로세스

①contextInitialized 메소드는 프로젝트 시작 시 트리거됩니다. 이 메소드는 한 가지 작업을 수행합니다. 즉, 상위 클래스 contextLoader의 initWebApplicationContext 메소드를 통해 Spring 컨텍스트 객체를 생성합니다. .

② initWebApplicationContext 메소드는 세 가지 작업을 수행합니다. WebApplicationContext를 생성하고, 해당 Spring 파일을 로드하여 Bean 인스턴스를 생성하고, WebApplicationContext를 ServletContext(Java 웹의 전역 변수)에 넣습니다.

③createWebApplicationContext는 컨텍스트 객체를 생성하고 사용자 정의 컨텍스트 객체를 지원하지만 ConfigurableWebApplicationContext에서 상속해야 하며 Spring MVC는 기본적으로 ConfigurableWebApplicationContext를 ApplicationContext(인터페이스일 뿐)의 구현으로 사용한다.

④configureAndRefreshWebApplicationContext 메소드는 ApplicationContext 데이터를 캡슐화하고 관련된 모든 Bean 객체를 초기화하는 데 사용됩니다. spring xml 데이터 소스 설정인 web.xml에서 contextConfigLocation이라는 구성을 읽어서 ApplicationContext에 넣고 마지막으로 전설적인 새로 고침 메소드를 호출하여 모든 Java 객체 생성을 수행합니다.

⑤ApplicationContext 생성을 완료한 후 이를 ServletContext에 넣고 저장되는 키 값 상수에 주의하세요.

방법 3:

Spring mvc에서 HandlerInterceptor 또는 HandlerInterceptorAdapter를 직접 사용하여 Filter:

교체

공용 클래스 WeiXinInterceptor는 HandlerInterceptor {
   @Autowired    private UsersService usersService를 구현합니다.   @override public boolean prehandle (httpservletrequest request, httpservletreponse 응답, 객체 핸들러) 예외 {// todo auto-auto-regenated method stub
return false;    }

   @Override    public void afterCompletion(HttpServletRequest 요청, HttpServletResponse 응답, 객체 처리기, 예외 예) 예외 {        // TODO 자동 생성 메서드 스텁        
   }
}




配置拦截路径:

   < ;mvc:인터셉터>

       

           

           

           
   


 

필터 中注入 서비스 的示例:

공용 클래스 WeiXinFilter는 필터를 구현합니다.{    
   private UsersService usersService;    
   public void init(FilterConfig fConfig)에서 ServletException 발생 {}    public WeiXinFilter() {}    public void destroy() {}    public void doFilter(ServletRequest 요청, ServletResponse 응답, FilterChain 체인)에서 IOException 발생, ServletException {
       HttpServletRequest req = (HttpServletRequest)request;
       HttpServletResponse resp = (HttpServletResponse)response;
       
       String userAgent = req.getHeader("user-agent");        if(userAgent != null && userAgent.toLowerCase().indexOf("micromessenger") != -1){    // 微信浏览器
           String servletPath = req.getServletPath();
           String requestURL = req. getRequestURL().toString();
           String queryString = req.getQueryString();
           if(queryString != null){                if(requestURL.indexOf("mtzs.html") !=-1 && queryString.indexOf("LLFlag")!=-1){
                   req.getSession() .setAttribute("LLFlag", "1");
                   chain.doFilter(요청, 응답);                    return;
               }
           }
           
           String openidDES = CookieUtil.getValueByName("openid", req);
           String 오픈아이디 = null;            if(StringUtils.isNotBlank(openidDES)){                시도 {
                   openid = DesUtil.decrypt(openidDES, "rxxxxxxxxxde");    // 解密获得openid
               } catch(예외 e) {
                   e.printStackTrace();
               }    
          }
           // ... ...
           문자열[] pathArray = {"/weixin/enterAppFromWeiXin.json", "/weixin/getWeiXinUserInfo.json",                                    "/weixin/getAccessTokenAndOpenid.json", "/sendRegCode.json", "/register.json",
                                  "/로그인. json", "/logon.json", "/dump.json", "/queryInfo.json"};
           List pathList = Arrays.asList(pathArray);            
           String loginSuccessUrl = req.getParameter("path");
           String fullLoginSuccessUrl = "http://www.axxxxxxx.cn/pc/";            if(requestURL.indexOf("weixin_gate.html") !=" 🎜> }
            ServletContext sc = req.getSession().getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);
        
            if(cxt != null && c xt.getBean( "usersService") != null && usersService == null)
               usersService = (UsersService) cxt.getBean("usersService");
        
            사용자 users = this.usersService.queryByOpenid(openid);
           // ... ...            if(pathList.contains(servletPath)){    // pathList 中的访问路径直接 pass
chain.doFilter(request, response); return;
}else{ } if(req.getSession().getAttribute(CommonConstants.SESSION_KEY_USER) == null){ // 로그인되지 않음
                  String llFlag = (String ) req .getSession().getAttribute("LLFlag");                                                                                    | > >                       반품;
}else{ // 이미 로그인되어 있음                                                                                                                   반품
                                                                                          WeChat 브라우저 chain.doFilter(요청, 응답);
}
}}




관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿