Ich bin im Projekt auf ein Problem gestoßen. Das Einfügen eines Dienstes in den Filter ist fehlgeschlagen und der eingefügte Dienst war immer null. Wie unten gezeigt:
öffentliche Klasse WeiXinFilter implementiert Filter{
@Autowired
private UsersService usersService;
public void doFilter(ServletRequest request, ServletResponse Antwort, FilterChain-Kette) löst IOException, ServletException aus {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
Benutzer Benutzer = this.usersService.queryBy Openid(openid);
}
Der obige Benutzerdienst meldet eine Nullzeigerausnahme.
Lösung 1:
public void doFilter(ServletRequest request, ServletResponse Response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request ;
HttpServletResponse resp = (HttpServletResponse)response; ServletContext sc = req.getSession().getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils. getWebApplicationContext(sc); != null && cxt.getBean ("usersService") != null && UsersService == null)
UsersService = (UsersService) cxt.getBean("UsersService");
Users Users = this.usersService .queryByOpenid(openid);
Das ist es.
Methode 2:
öffentliche Klasse WeiXinFilter implementiert Filter{
private UsersService usersService; public void init(FilterConfig fConfig) löst ServletException {
aus ServletContext sc = fConfig.getServletContext();
); Holen Sie sich ServletContext:
1) Holen Sie sich
ServletContext direkt in javax.servlet.Filter context = config.getServletContext();
2) Holen Sie sich
dies direkt in HttpServlet. getServletContext()
3) In anderen Methoden erhalten Sie über HttpServletRequest
request.getSession().getServletContext();2. blessht.iteye.com/blog/2121845): Der ContextLoaderListener von Spring ist ein Listener, der die ServletContextListener-Schnittstelle implementiert. Beim Starten des Projekts wird die contextInitialized-Methode ausgelöst (diese Methode schließt hauptsächlich die Erstellung des ApplicationContext-Objekts ab). . Die contextDestroyed-Methode wird ausgelöst, wenn das Projekt geschlossen wird (diese Methode führt den ApplicationContext-Bereinigungsvorgang aus).
Der Prozess des Ladens des Spring-Kontexts durch ConextLoaderListener
①Die contextInitialized-Methode wird beim Starten des Projekts ausgelöst. Diese Methode führt eine Aufgabe aus: Sie erstellt ein Spring-Kontextobjekt über die initWebApplicationContext-Methode der übergeordneten Klasse contextLoader .
②Die initWebApplicationContext-Methode führt drei Dinge aus: Sie erstellt einen WebApplicationContext, lädt die entsprechende Spring-Datei, um die Bean-Instanz zu erstellen, und fügt den WebApplicationContext in den ServletContext ein (die globale Variable von Java Web).
③createWebApplicationContext erstellt ein Kontextobjekt und unterstützt benutzerdefinierte Kontextobjekte, sie müssen jedoch von ConfigurableWebApplicationContext erben, und Spring MVC verwendet standardmäßig ConfigurableWebApplicationContext als Implementierung von ApplicationContext (es ist nur eine Schnittstelle).
④configureAndRefreshWebApplicationContext-Methode wird verwendet, um ApplicationContext-Daten zu kapseln und alle zugehörigen Bean-Objekte zu initialisieren. Es liest die Konfiguration mit dem Namen contextConfigLocation aus web.xml, der Spring-XML-Datenquelleneinstellung, und fügt sie dann in ApplicationContext ein und ruft schließlich die legendäre Aktualisierungsmethode auf, um die Erstellung aller Java-Objekte durchzuführen.
⑤Nach Abschluss der Erstellung des ApplicationContext fügen Sie ihn in den ServletContext ein und achten Sie auf die darin gespeicherte Schlüsselwertkonstante.
Methode 3:
Verwenden Sie HandlerInterceptor oder HandlerInterceptorAdapter direkt in Spring MVC, um Filter zu ersetzen:
öffentliche Klasse WeiXinInterceptor implementiert HandlerInterceptor {
@Autowired private UsersService usersService;
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse Response, Object handler) throws Exception { // TODO Automatisch generierter Methoden-Stub
return false;
}
@Override public void postHandle(HttpServletRequest request, HttpServletResponse Response, Object handler, ModelAndView modelAndView) wirft eine Ausnahme aus { // TODO Automatisch generierter Methoden-Stub
}
@Override public void ion(HttpServletRequest-Anfrage, HttpServletResponse-Antwort, Object handler, Exception ex) throws Exception { // TODO Automatisch generierter Methoden-Stub
;mvc:interceptors>
Filter 中注入 Service 的示例:
öffentliche Klasse WeiXinFilter implementiert Filter{
private UsersService usersService;
public void init(FilterConfig fConfig) throws ServletException {} public WeiXinFilter() {} public void destroy() {} public void doFilter(ServletRequest request, ServletResponse Response, FilterChain chain) throws 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(request, Response); return;
}
openid = null; if(StringUtils.isNotBlank(openidDES)){ try {
openid = DesUtil.decrypt(openidDES, "rxxxxxxxxxde"); // 解密获得openid
} Catch (Ausnahme e) {
e.printStackTrace();
}
}
// ... ...
String[] pathArray = {"/weixin/enterAppFromWeiXin.json", "/weixin/getWeiXinUserInfo.json", "/login. json", "/logon.json", "/dump.json", "/queryInfo.json"};
List
String loginSuccessUrl = req.getParameter("path");
String fullLoginSuccessUrl = "http://www.axxxxxxx.cn/pc/"; if (requesturl.indexof ("wixin_gate.html")! } ServletContext sc = req.getSession().getServletContext(); cxt != null && cxt.getBean( "usersService") != null && usersService == null)
usersService = (UsersService) cxt.getBean("usersService");
Users 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){ // Nicht angemeldet
String llFlag = (String ) req .GetSession (). GetAttribute ("llflag"); 🎜> }else{ // Bereits angemeldet zurück;
{