前端发送更改密码请求,头部携带token,服务端拦截器拦截头部token并解析,根据token中的信息来查询用户信息。需要登录才能进行的操作是由自己定的,有些操作可以直接放行。具体实现是:

上一章写到有三个注解,其中passtoken是直接放行,不需要验证即可进行的操作,userloginToken是需要token验证并通过才能进行的操作,CurrentUserConstants将token转化成CurrentUser。

下面就用简单的更改密码过程来运用一下UserLoginToken注解。

具体操作过程:

dao层

/**
     * 更改密码
     * @param email
     * @param newPassword
     */
    @Update("update user set password=#{newPassword} where email=#{email}")
    public void ChangePassword(String email,String newPassword);

service层

/**
     * 根据旧密码更改密码
     * @param usedPassword
     * @return
     */
    public RespEntity ChangePassword(String email,String usedPassword,String newPassword){
        user=userDao.login(email,usedPassword);
        if(user==null){
            respEntity=new RespEntity(RespCode.PASSWORD_FAILED);
        }else {
            userDao.ChangePassword(email,newPassword);
            respEntity=new RespEntity(RespCode.SUCCESS);
        }
        return respEntity;
    }

controller层

/**
     * 更改密码
     * @param user
     * @param map
     * @return
     */
    @UserLoginToken
    @RequestMapping("/changePassword")
    public RespEntity OperationPassword(@CurrentUser User user,@RequestBody Map<String,Object> map){
        String email=user.getEmail();
        String newPassword=(String)map.get("newPassword");
        String usedPassword=(String)map.get("usedPassword");
        respEntity=userService.ChangePassword(email,usedPassword,newPassword);
        return respEntity;
    }

在请求之前加入注解@UserLoginToken,声明该请求需要携带token才能进行的操作,@CurrentUser 获取发起请求的用户信息。

前端ajax请求在头部(header)携带token请求:

function changePassword(usedPassword,newPassword){
    $.ajax({
        async:false,
        url:tdoorurl+"changePassword",
        type:"POST",
        contentType:"application/json",
        dataType:"json",
        data:JSON.stringify({
            newPassword:newPassword,
            usedPassword:usedPassword
        }),
        headers:{
        //token保存在客户端的localstorage中,从localstorage中取出
            "Authorization":localStorage.getItem("token")
        },
        success:function(Msg){
            if(Msg.code==0){
                console.log("修改密码成功");
            }else{
                console.log("原密码错误");
            }
        },
        error:function(Msg){

        }
    })
}

相反,如果用户在执行不需要登录就放行的操作,在请求之前加上注解@PassToken。例如之前的登录操作:

@PassToken
    @RequestMapping("/login")
    public RespEntity testData(@RequestBody Map<String,Object> map){
        String email=(String)map.get("email");
        String password=(String)map.get("password");
        respEntity=userService.Login(email,password);
        return respEntity;
    }

以上就是三个注解的用法,在后面写的请求中,基本都是以这种形式来判断是否放行用户的操作。