if(session.getAttribute("user")!=null) { chain.doFilter(request, response); return; }else { request1.setAttribute("message", "你没有权限访问本页面,请先登录!!"); request1.getRequestDispatcher("/login.jsp").forward(request1,response); }
时间: 2023-07-19 19:21:47 浏览: 40
这段代码的作用是实现一个基于Session的用户权限控制。首先,代码通过调用Session对象的getAttribute()方法,获取名为"user"的属性。如果该属性存在,说明用户已经登录,可以继续执行后续的请求处理。如果该属性不存在,说明用户未登录,代码将设置一个错误消息,并将请求转发到登录页面。具体来说,代码将错误消息设置为名为"message"的请求属性,然后通过调用HttpServletRequest对象的getRequestDispatcher()方法获取一个用于请求转发的RequestDispatcher对象,最后调用RequestDispatcher对象的forward()方法将请求转发到/login.jsp页面。在登录页面中,用户可以输入用户名和密码进行登录,登录成功后再次访问受保护的资源时就可以得到正确的结果。
相关问题
public class BaseFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; String requestURI = httpRequest.getRequestURI(); if (requestURI.endsWith("load.jsp") || requestURI.endsWith("load.action")) { // 如果是load.jsp或load.action请求,则直接放行 chain.doFilter(request, response); return; } HttpSession session = httpRequest.getSession(false); if (session != null && session.getAttribute("user") != null) { // 如果已经登录,则放行请求 chain.doFilter(request, response); return; } // 否则跳转到登录页面 httpResponse.sendRedirect("/load.jsp"); } @Override public void destroy() { // 销毁 } }补全代码
这段代码是一个基础的过滤器实现,用于过滤所有的请求,检查用户是否已经登录,如果没有登录则跳转到登录页面。
完整的代码如下:
```
public class BaseFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String requestURI = httpRequest.getRequestURI();
if (requestURI.endsWith("load.jsp") || requestURI.endsWith("load.action")) {
// 如果是load.jsp或load.action请求,则直接放行
chain.doFilter(request, response);
return;
}
HttpSession session = httpRequest.getSession(false);
if (session != null && session.getAttribute("user") != null) {
// 如果已经登录,则放行请求
chain.doFilter(request, response);
return;
}
// 否则跳转到登录页面
httpResponse.sendRedirect("/load.jsp");
}
@Override
public void destroy() {
// 销毁
}
}
```
优化 @RequestMapping("login") public String login(@Nullable String refer, Model model, HttpSession session) { if (refer != null) { model.addAttribute("refer",refer); } if (session.getAttribute("user") != null ){ return "redirect:/"; } return "login"; }
对于这段代码,可以从以下几个方面进行优化:
1. 使用常量或枚举类来代替字符串,提高代码的可读性和可维护性。
2. 在参数列表中使用 `HttpServletRequest` 来代替 `HttpSession`,这样可以避免每次访问 Session 时都要调用 `getSession()` 方法,提高代码的性能和可读性。
3. 使用 `StringUtils` 工具类判断字符串是否为空,避免空指针异常。
4. 对于重复的代码可以进行封装,减少重复代码的出现。
下面是优化后的代码:
```java
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
private static final String LOGIN_PAGE = "login";
private static final String REDIRECT_INDEX = "redirect:/";
private static final String REFER = "refer";
private static final String USER = "user";
@RequestMapping("login")
public String login(@RequestParam(value = REFER, required = false) String refer,
Model model,
HttpServletRequest request) {
HttpSession session = request.getSession();
if (StringUtils.isNotBlank(refer)) {
model.addAttribute(REFER, refer);
}
if (session.getAttribute(USER) != null) {
return REDIRECT_INDEX;
}
return LOGIN_PAGE;
}
}
```
通过以上的优化,可以使代码更加清晰、简洁、易于维护,并且提高了代码的性能和可读性。