前端
request axios 的拦截器
import axios from 'axios'
import {Message, MessageBox} from 'element-ui'
const instance = axios.create();
instance.defaults.baseURL = 'http://localhost:8080';
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
instance.interceptors.request.use(function (config) {
config.headers['token'] = window.sessionStorage.getItem('token')
return config;
},
function (error) {
return Promise.reject(error);
}
);
instance.interceptors.response.use(
function (res) {
if (res.data.code == 200) {
return res;
}
if (res.data.code == 401) {
Message({
message: '没有权限',
type: 'error'
})
} else {
Message({
message: res.data.message,
type: 'error'
})
}
},
function (error) {
console.log(arguments)
MessageBox.alert(error.message, '系统提示', {
confirmButtonText: '确定',
type: 'error'
})
return Promise.reject(error);
}
);
export default instance;
Login.vue
<template>
<div class="center-container">
<el-card style="width: 500px;">
<div slot="header">
登陆
</div>
<el-form ref="loginForm" :model="loginForm" :rules="loginFormRules">
<el-form-item prop="account">
<el-input v-model="loginForm.account" placeholder="账号/手机/邮箱">
<template slot="prepend">
<i class="fa fa-user"></i>
</template>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input v-model="loginForm.password" placeholder="密码" show-password>
<template slot="prepend">
<i class="fa fa-lock"></i>
</template>
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" style="width: 100%" @click="submitLoginForm">登陆</el-button>
<!--router-link方式-->
<router-link to="/index.html">router-link链接方式</router-link><br>
<a href="index.html">直接使用超链接a标签</a>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
import qs from 'qs'
export default {
name: "Login",
data() {
return {
loginForm: {
account: 'admin',
password: '123456'
},
loginFormRules: {
account: [
{required: true, message: '账号必填'}
],
password: [
{required: true, message: '密码必填'}
]
}
};
},
watch: {
'loginForm.account'() {
console.log(this.loginForm)
}
},
methods: {
submitLoginForm() {
this.$refs.loginForm.validate((valid) => {
if (!valid) {
return false;
}
this.axios.post('/api/login.json',qs.stringify(this.loginForm)).then(res=>{
console.log(res)
let result = res.data;
if(result.code == 200){
console.log(result.data);
window.sessionStorage.setItem('loginUser',JSON.stringify(result.data));
window.sessionStorage.setItem('token',result.token);
this.$router.push('/index.html');
}else{
this.$message({
message: result.message,
type: 'error'
});
}
})
});
console.log(this.loginForm)
}
}
}
</script>
<style >
.center-container{
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-around;
}
.center-container .el-form-item__error{
padding-left: 55px;
}
</style>
后端
Authorization
package com.xuetang9.frame.uam.intercepter;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorization {
String scope() default "SESSION_LOGIN_TICKET";
boolean forward() default true;
String redirect() default "/no_authorization";
}
AuthorizationInterceptor
package com.xuetang9.frame.uam.intercepter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xuetang9.frame.uam.util.JsonResult;
import com.xuetang9.frame.uam.util.Token;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
public class AuthorizationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入了拦截器");
System.out.println("当前正在执行的handler");
System.out.println(handler);
System.out.println(handler.getClass());
if( !(handler instanceof HandlerMethod)){
return true;
}
HandlerMethod handlerMethod = (HandlerMethod)handler;
Authorization authorization = handlerMethod.getMethodAnnotation(Authorization.class);
if(authorization == null){
authorization = handlerMethod.getBeanType().getAnnotation(Authorization.class);
}
if(authorization == null){
return true;
}
Object ticket = request.getSession().getAttribute(authorization.scope());
System.out.println("--------------- interceptor ---" + request.getSession().getId());
if(ticket == null){
String token = request.getHeader("token");
System.out.println("token ---------" + token);
ObjectMapper objectMapper = new ObjectMapper();
Token tokenObj = objectMapper.readValue(token, Token.class);
long interval =tokenObj.getInterval();
long time = tokenObj.getCurrentTime();
if(time + interval > System.currentTimeMillis()){
return true;
}
if(authorization.forward()){
request.getRequestDispatcher(authorization.redirect()).forward(request, response);
}else {
response.sendRedirect(request.getContextPath() + authorization.redirect());
}
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
AppController
package com.xuetang9.frame.uam.web;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xuetang9.frame.uam.domain.User;
import com.xuetang9.frame.uam.domain.query.LoginQuery;
import com.xuetang9.frame.uam.intercepter.Authorization;
import com.xuetang9.frame.uam.service.UserService;
import com.xuetang9.frame.uam.util.JsonResult;
import com.xuetang9.frame.uam.util.Token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api")
@CrossOrigin
public class AppController {
private static final String SESSION_LOGIN_TICKET = "SESSION_LOGIN_TICKET";
@Autowired
private UserService userService;
@PostMapping("/login.json")
public JsonResult login(LoginQuery query, HttpSession session) throws JsonProcessingException {
JsonResult jsonResult = new JsonResult();
User loginUser = userService.login(query);
if(loginUser == null){
jsonResult.setCode(9999);
jsonResult.setMessage("账号或者密码错误");
}else{
session.setAttribute(SESSION_LOGIN_TICKET, loginUser);
Token tokenObj = new Token();
tokenObj.setId(loginUser.getId().toString());
tokenObj.setInterval(1000 * 60 * 10L);
tokenObj.setCurrentTime(System.currentTimeMillis());
String token = new ObjectMapper().writeValueAsString(tokenObj);
jsonResult.setToken(token);
jsonResult.setCode(HttpStatus.OK.value());
jsonResult.setData(loginUser);
}
return jsonResult;
}
}
AuthorizationController
package com.xuetang9.frame.uam.web;
import com.xuetang9.frame.uam.util.JsonResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthorizationController {
@GetMapping("/no_authorization")
public JsonResult unAuthor(){
JsonResult jsonResult = new JsonResult();
jsonResult.setCode(401);
jsonResult.setMessage("没有权限访问");
return jsonResult;
}
}
ResourceController
package com.xuetang9.frame.uam.web;
import com.xuetang9.frame.uam.domain.Resource;
import com.xuetang9.frame.uam.domain.User;
import com.xuetang9.frame.uam.intercepter.Authorization;
import com.xuetang9.frame.uam.service.ResourceService;
import com.xuetang9.frame.uam.util.JsonResult;
import com.xuetang9.frame.uam.util.NodeMapper;
import com.xuetang9.frame.uam.util.TreeNode;
import com.xuetang9.frame.uam.util.TreeUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
@RestController
@Slf4j
@Authorization
@CrossOrigin
@RequestMapping("/api")
public class ResourceController {
@Autowired
private ResourceService resourceService;
@ApiOperation(value = "添加资源",httpMethod = "post",response = JsonResult.class)
@PostMapping("resources")
public JsonResult add(@ApiParam Resource resource){
JsonResult jsonResult = new JsonResult();
try {
resourceService.save(resource);
jsonResult.setCode(HttpStatus.OK.value());
jsonResult.setData(resource);
}catch (Exception e){
jsonResult.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
jsonResult.setError(e);
}
return jsonResult;
}
@DeleteMapping("resources/{id}")
public JsonResult remove(@PathVariable int id){
JsonResult jsonResult = new JsonResult();
try{
boolean success = resourceService.deleteById(id);
if(success){
jsonResult.setCode(HttpStatus.OK.value());
}else{
jsonResult.setCode(10000);
}
}catch (Exception e){
jsonResult.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
jsonResult.setError(e);
}
return jsonResult;
}
@PostMapping("resources/{id}")
public JsonResult update(@PathVariable int id, Resource resource){
log.debug(resource.toString());
JsonResult jsonResult = new JsonResult();
try {
resource.setId(id);
boolean success = resourceService.updateByIdWithoutNull(resource);
if(success){
jsonResult.setCode(200);
}else{
jsonResult.setCode(10001);
jsonResult.setData(resource);
}
}catch (Exception e){
jsonResult.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
jsonResult.setError(e);
}
return jsonResult;
}
@GetMapping("resources/{id}")
public JsonResult get(@PathVariable int id){
JsonResult jsonResult = new JsonResult();
try {
Resource resource = resourceService.getById(id);
jsonResult.setCode(HttpStatus.OK.value());
jsonResult.setData(resource);
}catch (Exception e){
jsonResult.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
jsonResult.setError(e);
}
return jsonResult;
}
@GetMapping("/resources")
public JsonResult listTree(){
JsonResult jsonResult = new JsonResult();
List<Resource> resources = resourceService.listAll();
List<TreeNode> tree = TreeUtils.listToTree(resources, create());
jsonResult.setData(tree);
jsonResult.setCode(HttpStatus.OK.value());
return jsonResult;
}
@GetMapping("/menus")
public JsonResult listMenus(HttpSession session){
System.out.println("---------- menu ----" + session.getId());
JsonResult jsonResult = new JsonResult();
try {
List<Resource> resources = resourceService.listMenus(3);
List<TreeNode> tree = TreeUtils.listToTree(resources, create());
jsonResult.setData(tree);
jsonResult.setCode(HttpStatus.OK.value());
}catch (Exception e){
jsonResult.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
jsonResult.setError(e);
jsonResult.setMessage(e.getMessage());
}
return jsonResult;
}
@GetMapping("resources/roles/{id}")
public JsonResult listRoleResources(@PathVariable int id){
JsonResult jsonResult = new JsonResult();
List<Resource> list = resourceService.listByRoleId(id);
jsonResult.setCode(HttpStatus.OK.value());
jsonResult.setData(list);
return jsonResult;
}
private NodeMapper<Resource> create(){
return new NodeMapper<Resource>() {
@Override
public TreeNode objectMapper(Resource object) {
TreeNode node = new TreeNode();
node.setId(object.getId());
node.setText(object.getName());
node.setPid(object.getParentId());
node.setHref(object.getUrl());
node.setIcon(object.getIcon());
node.setRaw(object);
return node;
}
};
}
}
Token
package com.xuetang9.frame.uam.util;
import lombok.Data;
import java.io.Serializable;
@Data
public class Token implements Serializable {
private String id;
private Long interval;
private Long currentTime;
}
NodeMapper
package com.xuetang9.frame.uam.util;
public interface NodeMapper<T> {
TreeNode objectMapper(T object);
}
TreeNode
package com.xuetang9.frame.uam.util;
import lombok.Data;
import java.util.List;
@Data
public class TreeNode<T> {
private Integer id;
private String text;
private String icon;
private String href;
private Integer pid;
private Integer depth;
private Boolean expanded;
private Boolean checked;
private List<TreeNode> children;
private T raw;
}
TreeUtils
package com.xuetang9.frame.uam.util;
import java.util.ArrayList;
import java.util.List;
public class TreeUtils {
public static <T> List<TreeNode> listToTree(List<T> list, NodeMapper<T> mapper){
List<TreeNode> nodes = new ArrayList<>();
for(T row : list){
TreeNode node = mapper.objectMapper(row);
nodes.add(node);
}
List<TreeNode> tree = new ArrayList<>();
for(TreeNode node : nodes){
if(node.getPid().equals(0)){
tree.add(node);
node.setDepth(0);
findChildNodes(node, nodes);
}
}
return tree;
}
public static void findChildNodes(TreeNode parentNode, List<TreeNode> nodes){
for(TreeNode child: nodes){
if(parentNode.getId().equals(child.getPid())){
if(parentNode.getChildren() == null){
parentNode.setChildren(new ArrayList<>());
}
child.setDepth(parentNode.getDepth() + 1);
parentNode.getChildren().add(child);
findChildNodes(child, nodes);
}
}
}
}