ホームページ  >  記事  >  类库下载  >  Javaフィルターにサービスを挿入する方法

Javaフィルターにサービスを挿入する方法

巴扎黑
巴扎黑オリジナル
2016-11-26 09:10:381817ブラウズ

プロジェクトで問題が発生しました。フィルターへのサービスの注入が失敗し、注入されたサービスは常に null でした。以下に示すように:

public class WeiXinFilterimplements Filter{
@Autowired
private UsersService usersService;

public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request ;
HttpServletResponse resp = (HttpServletResponse)response;
Users users = this.usersService.queryByOpenid(openid);
}

上記の usersService は null ポインタ例外を報告します。

解決策 1:

public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponce resp = (HttpServletResponse)応答; ServletContext sc = 要求.getSession().getServletContext(); = null && usersService == null)
UsersService = (Usersservice) CXT.GetBean ("Usersservice");

ユーザー users = this.usersservice.querybyopenid (openid);

方法 2:

public class WeiXinFilter は Filter{

private UsersService usersService;

public void init(FilterConfig fConfig) throws ServletException {

ServletContext sc = fConfig.getServletContext( );

XmlWebApplicationContext cxt = ( XmlWebApplicationContext)WebApplicationContextUtils。 getWebApplicationContext(sc); )


関連原則:

1. ServletContext の取得方法:

1) javax.servlet.Filter で直接取得します。
ServletContext context = config.getServletContext(); HttpServlet で直接取得します
this.getServletContext( )

3) 他のメソッドで、

request.getSession().getServletContext();

2. WebApplicationContext と ServletContext を取得します (http://blessht.iteye. com/blog/2121845) HttpServletRequest 経由:

Spring の ContextLoaderListener は、ServletContextListener インターフェイスを実装するリスナーです。プロジェクトの開始時に、contextInitialized メソッドがトリガーされます (このメソッドは主に、プロジェクトの開始時に ApplicationContext オブジェクトの作成を完了します)。閉じられると、contextDestroyed メソッドがトリガーされます (このメソッドは ApplicationContext のクリーンアップ操作を実行します)。

ConextLoaderListenerによるSpringコンテキストの読み込み処理

①プロジェクトの開始時にcontextInitializedメソッドがトリガーされます。このメソッドは、親クラスcontextLoaderのinitWebApplicationContextメソッドを通じてSpringコンテキストオブジェクトを作成することを1つ行います。

② initWebApplicationContext メソッドは 3 つのことを行います: WebApplicationContext を作成し、対応する Spring ファイルをロードして内部に Bean インスタンスを作成し、WebApplicationContext を ServletContext (Java Web のグローバル変数) に置きます。

③createWebApplicationContext はコンテキスト オブジェクトを作成し、ユーザー定義のコンテキスト オブジェクトをサポートしますが、これらは ConfigurableWebApplicationContext から継承する必要があり、Spring MVC はデフォルトで ConfigurableWebApplicationContext を ApplicationContext (単なるインターフェイス) の実装として使用します。

④configureAndRefreshWebApplicationContext メソッドは、ApplicationContext データをカプセル化し、関連するすべての Bean オブジェクトを初期化するために使用されます。これは、Spring XML データ ソース設定である web.xml から contextConfigLocation という名前の設定を読み取り、それを ApplicationContext に入れ、最後に伝説的な更新メソッドを呼び出して、すべての Java オブジェクトの作成を実行します。

⑤ ApplicationContext を作成したら、それを ServletContext に配置し、格納されているキー値の定数に注意してください。

方法 3:

Spring MVC で HandlerInterceptor または HandlerInterceptorAdapter を直接使用して Filter:

を置き換えます

public class WeiXinInterceptor は HandlerInterceptor {
@Autowired private UsersService usersService; を実装します。  

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO 自動生成メソッドスタブ
return false;
}

@Override public void postHandle(HttpServletRequest リクエスト、HttpServletResponse レスポンス、オブジェクト ハンドラー, ModelAndView modelAndView) throws Exception { // TODO 自動生成メソッド スタブ
}

@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws ion { // TODO 自動生成メソッドスタブ
}
}

構成拦截路径:


/>

   


フィルター中注入サービスの例:

public class WeiXinFilter は Filter{
private UsersService usersService; を実装します。    
public void init(FilterConfig fConfig) throws ServletException {} public WeiXinFilter() {} public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException {
HttpServletRequest req = (H ttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse)response;

String userAgent = req.getHeader("user-agent");        if(useragent!= null && useragent.tolowercase()。indexof( "micromessenger")!= -1){// 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 openid = null;            if(StringUtils.isNotBlank(openidDES)){ 試してみてください {
openid = DesUtil.decrypt(openidDES, "rxxxxxxxxxde");    // 解密获得openid
} catch (Exception e) {
e.printStackTrace();
}
}
// ... ...
String[] pathArray = {"/weixin/enterAppFromWeiXin.json", " /weixin/getWeiXinUserInfo.json", "/weixin/getAccessTokenAndOpenid.json", "/sendRegCode.json", "/register.json",
「/login.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") != -1){
req.getSession().setAttribute("loginSuccessUrl", loginSuccessUrl);
// ... ...
}
ServletContext sc = req .getSession().getServletContext();
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(sc);

if(cxt != null && cxt.getBean("usersService") != null && usersService == null)
usersService = (UsersService) cxt.getBean("usersService");

ユーザー users = this.usersService.queryByOpenid(openid);
// ... ... if(pathList.contains(servletPath)){ / /パスリスト中的访问路直通
chain.doFilter(リクエスト、レスポンス); String llFlag = (String) req.getSession() .getAttribute("LLFlag"); if(llFlag ! = null && llFlag.equals("1")){戻る;
。 .// 3. Tencent ServerからWeChatのOpenIDを取得します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。