java隨記

          堅持就是勝利!

           

          springboot中action綁定ServletRequest的attirbute的值傳參

          有些時候需要在后臺處理一封裝一些參數送到action中便于業務處理.比于app中的token驗證,
          根據token查找到對應的用戶信息。比如分布式框架中獲取用戶信息等.springboot中可以自
          定義參數解析器來綁定參數,通過它可以拿到ServletRequest中的attirbute中的值進行參數
          綁定。

          自定義一個annotation,通過這個注解中的 name查找attribute中的key對應的值 

          import java.lang.annotation.ElementType;
          import java.lang.annotation.Retention;
          import java.lang.annotation.RetentionPolicy;
          import java.lang.annotation.Target;
          @Target(ElementType.PARAMETER)
          @Retention(RetentionPolicy.RUNTIME)
          public @interface AttributeResolve {
          String name() default "user";
          }

          自定義一個解析器類

          import javax.servlet.http.HttpServletRequest;
          import org.springframework.core.MethodParameter;
          import org.springframework.web.bind.support.WebDataBinderFactory;
          import org.springframework.web.context.request.NativeWebRequest;
          import org.springframework.web.method.support.HandlerMethodArgumentResolver;
          import org.springframework.web.method.support.ModelAndViewContainer;
          public class AttributeArgumentResolver implements HandlerMethodArgumentResolver{
          @Override
          public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2,
          WebDataBinderFactory arg3) throws Exception {
          // TODO Auto-generated method stub
          Object resultObj=null;
           AttributeResolve mp =  arg0.getParameterAnnotation(AttributeResolve.class);
           if(mp!=null) {
          String attributeName= mp.name();
          HttpServletRequest request = arg2.getNativeRequest(HttpServletRequest.class);
          resultObj = request.getAttribute(attributeName);
           }
          return resultObj;
          }
          @Override
          public boolean supportsParameter(MethodParameter arg0) {
          // TODO Auto-generated method stub
          return  arg0.hasParameterAnnotation(AttributeResolve.class);
          }

          springboot中注冊自定義的參數解析器
          @Configuration
          public class MyWebMvcConfig extends WebMvcConfigurerAdapter{
          public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
                  argumentResolvers.add(new AttributeArgumentResolver());
              }
          }


          使用方法.
          需要在action調用前向HttpServletRequest中的attribute中注入值 ,可以自定義一個filter,在filter中進行處理
          如在filter中處理app傳過來的token驗證后取得對應的用戶信息等.下面例子簡單放入一個對象
          @WebFilter(filterName = "axssFilter", urlPatterns = "/*",
          initParams = {
          @WebInitParam(name = "ignores", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略資源
          }
          )
          public class XssFilter implements javax.servlet.Filter{
          private Set<String> prefixIignores = new HashSet<String>();
          @Override
          public void destroy() {
          // TODO Auto-generated method stub
          }
          @Override
          public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
          throws IOException, ServletException {
          // TODO Auto-generated method stub
          HttpServletRequest request = (HttpServletRequest) req;
          HttpServletResponse response = (HttpServletResponse) res;
                      Blogger user = new Blogger();
                    user.setUsername("asfdasdf");
                   request.setAttribute("user", user);
                         chain.doFilter(request, response);  
          }
          }

          action獲取attribute中放入的對象
                  @RequestMapping("/index")
          public String index(@AttributeResolve(name="user") Bloggerbh, HttpServletRequest request,Model model) 

          嗯,還算優雅


          posted on 2017-09-29 11:58 傻 瓜 閱讀(1712) 評論(0)  編輯  收藏 所屬分類: 雜項

          導航

          統計

          常用鏈接

          留言簿(7)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          友情鏈接

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 班玛县| 文登市| 台州市| 北流市| 开化县| 祁东县| 黄平县| 泾源县| 潍坊市| 庆安县| 许昌市| 农安县| 西城区| 株洲市| 舒城县| 大足县| 黔江区| 广灵县| 新竹县| 平顺县| 京山县| 甘德县| 洪泽县| 礼泉县| 精河县| 衡水市| 佛山市| 古浪县| 永济市| 鄂托克前旗| 秦皇岛市| 锡林郭勒盟| 黎川县| 新丰县| 宁明县| 汶上县| 东城区| 六枝特区| 溧阳市| 新乐市| 鄂州市|