首先说一下我的问题:我正在做一个网上商城的案列,现在的情况是这样的,关于用户在没有登录的情况下浏览商品之后提交订单,在提交订单的时候进行判断如果用户已经登录过了就直接把订单保存到数据库,如果没有就提示登录。用户在登录完成的时候存一个用户session,控制层获得session,可是在没有登录的时候就没有那个session,在订单处理控制层自然就获取不到,我应该怎么办才可行,提供一个解决方案就行了,谢谢。说了很多,不知道各位有没有懂我的意思
首先,每个请求到后台都会抽象为一个HttpRequestServlet的实例,这里面就有Session的信息,可以从中判断是否有Session。
其次,Session判断通常用的是Filter拦截器,判断请求中是否有Session信息。提供一个实现Demo:
/**
* (non-Javadoc) 过滤器
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse,
* javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
if(!IS_SECURITY_FILTER){
logger.debug("安全过滤器未启用! ");
chain.doFilter(request, response);
return;
}
// 判断是否使用HTTP
checkRequestResponse(request, response);
// 转型
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("P3P", "CP=\"CAO PSA OUR\"");
// 取用户访问的URL
String uri = httpRequest.getRequestURI();
logger.debug("请求servletPath:"+httpRequest.getRequestURI());
// 登录界面 ,不处理,交给登录模块处理逻辑
if(isNotFilter(uri)){
logger.debug(uri+"的请求为非检查地址,安全过滤允许通过 ");
chain.doFilter(request, response);
return;
}
try {
// 取用户登录后的User
User rtUser = (User) request.getSession().getAttribute(request.getSession().getId());
if (rtUser == null) {
logger.debug("用户会话已过期或未登录,安全过滤器禁止访问,并跳转到错误页面 ");
// 没有登录,返回登录界面
httpRequest.getRequestDispatcher(loginUrl).forward(httpRequest, httpResponse);
return;
}
chain.doFilter(request, response);
} catch (Exception ex) {
ex.printStackTrace();
logger.error("安全过滤器会话检查异常", ex);
}
}
其实可以使用拦截器或者框架shiro来实现,如果用shiro只需要在配置文件里面写拦截哪些访问路径就行了,比如
<!-- Shiro过滤器 -->
<!-- Shiro的核心安全接口,这个属性是必须的 -->
<!-- 身份认证失败,则跳转到登录页面的配置 -->
<!-- Shiro连接约束配置,即过滤链的定义 -->
/* =authc
/admin/** = authc
/users/** = authc
/roles/** = authc
/manager/**=anon
/permissions/** = authc
/manager/login=anon
/static/* = anon
/logout = logout
authc是需要验证才能访问的,而anon是不需要验证的,而且shiro还有很好的session控制,可以获取在线用户。你这个最好使用shiro。