프로젝트에서 문제가 발생했습니다. 필터에 서비스를 주입하는 데 실패했고 주입된 서비스가 항상 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);
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에서 직접 가져오기
request.getSession().getServletContext();
를 통해 가져옵니다.
2. blessht.iteye.com/blog/2121845):
Spring의 ContextLoaderListener는 ServletContextListener 인터페이스를 구현하는 리스너입니다. 프로젝트를 시작할 때 contextInitialized 메소드가 트리거됩니다(이 메소드는 주로 ApplicationContext 객체 생성을 완료합니다). . contextDestroyed 메소드는 프로젝트가 닫힐 때 트리거됩니다(이 메소드는 ApplicationContext 정리 작업을 수행합니다).
ConextLoaderListener에 의한 Spring 컨텍스트 로드 프로세스
①contextInitialized 메소드는 프로젝트 시작 시 트리거됩니다. 이 메소드는 한 가지 작업을 수행합니다. 즉, 상위 클래스 contextLoader의 initWebApplicationContext 메소드를 통해 Spring 컨텍스트 객체를 생성합니다. .
교체
공용 클래스 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
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(요청, 응답);
}
}}