HttpServletRequest.getRequestUri不能获取forward之前的uri解决
时间: 2023-07-27 16:09:23 浏览: 189
如果您使用的是Servlet API 3.0或更高版本,可以使用HttpServletRequest的getAttribute方法和RequestDispatcher的forward方法来解决这个问题。
在您的Servlet中,您可以将请求转发到另一个Servlet或JSP页面:
```java
RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/another/servlet");
dispatcher.forward(request, response);
```
在这种情况下,您可以将当前请求的URI作为属性存储在请求对象中:
```java
request.setAttribute("originalUri", request.getRequestURI());
```
在另一个Servlet或JSP页面中,您可以通过以下方式获取原始URI:
```java
String originalUri = (String) request.getAttribute("originalUri");
```
这样,您就可以在转发之前保存原始URI,以便将来使用。
相关问题
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { // 该方法是在控制器方法前执行,如果为真,则继续下一步的操作,也就是执行控制器方法或调用下一个拦截器;为假,则中断 String uri=request.getRequestURI(); if(uri.indexOf("login")>0) { return true; } if(request.getSession().getAttribute("user")!=null) { return true; } // request.getSession().setAttribute("msg","您还没有登录,请先登录!"); request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response); return false; }
根据你提供的代码可以看出,这是一个拦截器类的代码,用于拦截请求并进行处理。该拦截器的作用是检查用户是否已经登录,如果没有登录,则重定向到登录页面。如果已经登录,则放行请求。
该拦截器的核心代码是preHandle()方法,该方法在控制器方法前执行。在该方法中,首先获取请求的URI,然后判断该URI是否包含"login"字符串,如果包含,则放行请求,否则检查用户是否已经登录,如果已经登录,则放行请求,否则将请求转发到登录页面。
如果你的访问被拦截了,可以检查该拦截器的配置是否正确,或者检查你的请求是否符合该拦截器的拦截规则。如果你仍然无法解决问题,可以查看服务器的日志,查找错误信息,或者向开发人员寻求帮助。
解释一下public class LoginInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri=request.getRequestURI(); if (uri.indexOf("toLogin")!=-1 || uri.indexOf("login")!=-1 || uri.indexOf("login.jsp")!=-1 || uri.indexOf("getVarifyCode")!=-1 || uri.indexOf("register.jsp")!=-1 || uri.indexOf("register")!=-1 || uri.indexOf("toRegister")!=-1){ return true; } User userInfo=(User) request.getSession().getAttribute("userInfo"); if (userInfo==null){ //请求转发 request.getRequestDispatcher("/user/toLogin").forward(request,response); return false; } return true; } }
这是一个 Spring MVC 拦截器类,实现了 HandlerInterceptor 接口,用于拦截用户的登录请求。其中,preHandle() 方法是该接口中定义的方法,用于在请求被处理之前进行拦截处理。
在 preHandle() 方法中,首先获取请求的 URI,判断该请求是否是登录或注册相关的请求,如果是,则放行。如果请求不是登录或注册相关的请求,则判断用户是否已经登录,如果未登录,则通过请求转发将用户重定向到登录页面,否则放行。
具体来说,如果请求的 URI 中包含 "toLogin"、"login"、"login.jsp"、"getVarifyCode"、"register.jsp"、"register" 或 "toRegister",则认为是登录或注册相关的请求,直接放行。否则,从 HttpSession 中获取名为 "userInfo" 的属性,如果该属性为空,则表示用户未登录,通过 request.getRequestDispatcher().forward() 方法将请求转发到登录页面,返回 false 表示拦截请求。否则,表示用户已经登录,放行请求,返回 true。
通过拦截器可以有效地控制用户的访问权限,确保只有已登录的用户才能访问需要登录才能访问的页面。
阅读全文