찾다
类库下载java类库Java 필터에 서비스를 주입하는 방법

프로젝트에서 문제가 발생했습니다. 필터에 서비스를 주입하는 데 실패했고 주입된 서비스가 항상 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(요청, 응답);
}
}}




성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경