前后端分离项目shiro验证

来源:互联网 发布:开淘宝店物流怎么解决 编辑:程序博客网 时间:2024/06/06 15:52

公司新项目,要做前后端分离项目,在开发过程中,需要使用shiro来做会话管理。由于是前后端分离 ,前端是通过ajax请求后端地址,后端程序没办法将sessionId写到请求浏览器cookie中,所以需要重新设想方案。

通过对shiro项目研究发现,shiro框架在每次请求的cookie中,都带有一对这样的参数

  JSESSIONID=476dae2a-4cf7-49f9-a684-3a4736d2b1b6

  然后,我们使用httpclinet 带上该cookie模拟请求,发现可以通过验证,拿到数据。 然后通过调试发现,这个JSESSIONID所保存的就是回话sessionId。所以我们设想,在登录的时候,给前端返回改字段,让前端将这个字段写入到cookie中,这样每次请求自动带上了该cookie,从而实现会话验证。


shiro的配置文件如下:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">    <property name="securityManager" ref="securityManager"/>    <property name="loginUrl" value="/api/user/login"/>    <property name="successUrl" value="/"/>    <property name="unauthorizedUrl" value="/page/401"/>    <property name="filters">        <util:map>            <entry key="login" value-ref="loginFilter"></entry>        </util:map>    </property>    <property name="filterChainDefinitions">        <value>            <!-- 登录页允许访问 -->            /api/user/login = anon            <!-- 其他资源需要认证 -->            /** = login        </value>    </property></bean>

对于登入接口不做权限控制,对于其他接口增加了一个拦截器的配置。



拦截器的代码如下

public class LoginFilter extends AccessControlFilter {    @Override    protected boolean isAccessAllowed(ServletRequest request,                                      ServletResponse response, Object mappedValue) throws Exception {        Subject subject = SecurityUtils.getSubject();        if(null != subject && subject.isAuthenticated()){            return Boolean.TRUE;        }      /*  if (WebUtils.isAjax(request)) {// ajax请求*/        Map<String,String> resultMap = new HashMap<String, String>(5);        resultMap.put("code", MessageCode.USER_NOT_LOGIN[0]);        resultMap.put("status", Constant.STATUS_FAIL);        resultMap.put("msg", MessageCode.USER_NOT_LOGIN[1]);//当前用户没有登录!        WebUtils.out((HttpServletRequest) request,(HttpServletResponse) response, resultMap);        /*}*/        return Boolean.FALSE ;    }    @Override    protected boolean onAccessDenied(ServletRequest request, ServletResponse response)            throws Exception {        //保存Request和Response 到登录后的链接       /* saveRequestAndRedirectToLogin(request, response);*/        return Boolean.FALSE ;    }}

拦截器对于所有未登录,或者session过期的用户直接返回json拦截。



原创粉丝点击