拦截器获取request的值之后,Controller拿不到值的解决

网友投稿 827 2022-11-28

-获取request的值之后,Controller拿不到值的解决

-获取request的值之后,Controller拿不到值的解决

目录-获取request的值之后,Controller拿不到值原因解决方法使用-获取Controller方法名和注解信息方法一:通过request获得用户的URL方法二:通过用户要访问的方法来判断是否有权限方法三:自定义注解

-获取request的值之后,Controller拿不到值

原因

在Spring中request的值只能被获取一次,-获取之后就会导致Controller拿不到值

解决方法

将request的值进行备份,请求到达Controller的时候就会拿到这个值

创建一个自己的HttpServletRequestWrapper并继承servlet的HttpServletRequestWrapper,为了备份request中的值。

public class cHAuRBDiMyHttpServletRequestWrapper extends HttpServletRequestWrapper {

private final byte[] buff;

public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {

super(request);

InputStream is = request.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] b = new byte[1024];

int len;

while ((len = is.read(b)) != -1) {

baos.write(b, 0, len);

}

buff = baos.toByteArray();

}

@Override

public ServletInputStream getInputStream() throws IOException {

final ByteArrayInputStream bais = new ByteArrayInputStream(buff);

return new ServletInputStream() {

@Override

public int read() throws IOException {

return bais.read();

}

};

}

@Override

public BufferedReader getReader() throws IOException {

return new BufferedReader(new InputStreamReader(getInputStream()));

}

}

创建一个Filter,将该过滤器配置在项目中,为了调用备份的HttpServletRequestWrapper

public class MyRequestBodyFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

servletRequest = new MyHttpServletRequestWrapper(httpServletRequest);

filterChain.doFilter(servletRequest, servletResponse);

}

@Override

public void destroy() {

}

}

创建一个工具类,在-中获取request的值

public class RequestUtils {

public static String getRequestValue(HttpServletRequest request) throws IOException {

StringBuffer sb = new StringBuffer();

MyHttpServletRequestWrapper myHttpServletRequestWrapper = new MyHttpServletRequestWrapper(request);

InputStream is = myHttpServletRequestWrapper.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String str;

while ((str = br.readLine()) != null) {

sb.append(str);

}

return sb.toString();

}

}

使用-获取Controller方法名和注解信息

在使用SpringMVC进行项目的时候用到了权限验证。

表分为:

用户表

角色表

资源表

用户-角色-资源都是多对多的关系,验证无非就是收到请求后,在-循环判断用户是否有权限执行操作。

方法一:通过request获得用户的URL

再逐一循环判断是否可以操作

只是这种方法很让人难受。

方法二:通过用户要访问的方法来判断是否有权限

preHandle方法中hancHAuRBDidler实际为HandlerMethod,(看网上说的有时候不是HandlerMethod),加个instanceof验证吧

可以得到方法名:h.getMethod().getName()

可以得到RequestMapping注解中的值:h.getMethodAnnotation(RequestMapping.class)

这种方法还是不太方便

方法三:自定义注解

自定义注解代码

@Retention(RUNTIME)

@Target(METHOD)

public @interface MyOperation {

String value() default "";//默认为空,因为名字是value,实际操作中可以不写"value="

}

Controller代码:

@Controller("testController")

public class TestController {

@MyOperation("用户修改")//主要看这里

@RequestMapping("test")

@ResponseBody

public String test(String id) {

return "Hello,2018!"+id;

}

}

-的代码:

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

System.out.println("进入-");

if(handler instanceof HandlerMethod) {

HandlerMethod h = (HandlerMethod)handler;

System.out.println("用户想执行的操作是:"+h.getMethodAnnotation(MyOperation.class).value());

//判断后执行操作...

}

return HandlerInterceptor.super.preHandle(request, response, handler);

}

补充

在每个方法上面加注解太麻烦啦,可以在类上加注解

@Retention(RUNTIME)

@Target(TYPE)

public @interface MyOperation {

String value() default "";

}

//-中这样获得

h.getMethod().getDeclaringClass().getAnnotation(MyOperation.class);

我可以获取requestMapping,不用创建自定义注解啊,值得注意的是,不要使用GetMapping等,要使用requestMapping。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:HDU 2444 The Accomodation of Students——二分图判定+最大匹配
下一篇:UVA - 323 Jury Compromise——01背包
相关文章

 发表评论

暂时没有评论,来抢沙发吧~