Commit 621b7817 authored by cy's avatar cy

修改shiro管理,添加vip用户

parent 227b8f9c
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
<result column="update_time" property="updateTime"/> <result column="update_time" property="updateTime"/>
<result column="is_vip" property="isVip"/> <result column="is_vip" property="isVip"/>
<result column="openid" property="openid"/> <result column="openid" property="openid"/>
<result column="vip_mobile" property="vipMobile"/>
</resultMap> </resultMap>
<sql id="table"> <sql id="table">
...@@ -30,12 +31,12 @@ ...@@ -30,12 +31,12 @@
</sql> </sql>
<sql id="cols_exclude_id"> <sql id="cols_exclude_id">
user_name,password, phone,uuid,head_image,sex,school, exam_type,source,is_delete,create_time,update_time,is_vip,openid user_name,password, phone,uuid,head_image,sex,school, exam_type,source,is_delete,create_time,update_time,is_vip,openid,vip_mobile
</sql> </sql>
<sql id="vals"> <sql id="vals">
#{userName},#{password},#{phone},#{uuid},#{headImage},#{sex},#{school},#{examType}, #{source}, #{userName},#{password},#{phone},#{uuid},#{headImage},#{sex},#{school},#{examType}, #{source},
#{isDelete},now(),now(),#{isVip},#{openid} #{isDelete},now(),now(),#{isVip},#{openid},#{vipMobile}
</sql> </sql>
<sql id="updateCondition"> <sql id="updateCondition">
...@@ -51,7 +52,8 @@ ...@@ -51,7 +52,8 @@
<if test="isDelete != null">is_delete = #{isDelete},</if> <if test="isDelete != null">is_delete = #{isDelete},</if>
update_time =now(), update_time =now(),
<if test="isVip != null">is_vip = #{isVip},</if> <if test="isVip != null">is_vip = #{isVip},</if>
<if test="openid != null">openid =#{openid}</if> <if test="openid != null">openid =#{openid},</if>
<if test="vipMobile != null">vip_mobile =#{vipMobile}</if>
</sql> </sql>
<sql id="criteria"> <sql id="criteria">
...@@ -119,7 +121,7 @@ ...@@ -119,7 +121,7 @@
from from
<include refid="table"/> <include refid="table"/>
<where> <where>
is_delete=0 is_delete=0 and is_vip = 2
<if test="startTime != null"> <if test="startTime != null">
and create_time and create_time
...@@ -143,7 +145,7 @@ ...@@ -143,7 +145,7 @@
FROM FROM
<include refid="table"/> <include refid="table"/>
<where> <where>
is_delete=0 is_delete=0 and is_vip = 2
<if test="startTime != null"> <if test="startTime != null">
and create_time and create_time
......
...@@ -108,4 +108,10 @@ public class User implements Serializable { ...@@ -108,4 +108,10 @@ public class User implements Serializable {
@ApiModelProperty(name = "微信用户openid", value = "openid") @ApiModelProperty(name = "微信用户openid", value = "openid")
private String openid; private String openid;
/**
* vip电话号码
*/
@ApiModelProperty(name = "vipMobile", value = "vip电话号码")
private String vipMobile;
} }
package cn.wisenergy.model.dto;
import cn.wisenergy.model.app.ScoreInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("StaffAddDto")
public class StaffAddDto {
private static final long serialVersionUID = 1L;
/**
* 用户名称
*/
@ApiModelProperty(value = "用户名称", name = "userName")
private String userName;
/**
* 性别
*/
@ApiModelProperty(value = "性别", name = "sex")
private Integer sex;
/**
* 学校
*/
@ApiModelProperty(value = "学校", name = "school")
private String school;
/**
* 考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生
*/
@ApiModelProperty(value = "考生类型 1:文化课考生 2:美术生 3:体育生 4:文学编导考生", name = "studentType")
private Integer studentType;
/**
* 学生成绩信息
*/
@ApiModelProperty(value = "学生成绩信息", name = "scoreInfo")
private ScoreInfo scoreInfo;
/**
* vip客户电话
*/
@ApiModelProperty(value = "vip客户电话", name = "VipMobile")
private String VipMobile;
}
...@@ -71,6 +71,13 @@ public class UserDto implements Serializable { ...@@ -71,6 +71,13 @@ public class UserDto implements Serializable {
@ExcelProperty(value = "手机号") @ExcelProperty(value = "手机号")
private String phone; private String phone;
/**
* vip手机号
*/
@ApiModelProperty(value = "vip手机号", name = "vipMobile")
@ExcelProperty(value = "vip手机号")
private String vipMobile;
/** /**
* 学校 * 学校
*/ */
......
...@@ -69,6 +69,13 @@ public class UserInfoDto implements Serializable { ...@@ -69,6 +69,13 @@ public class UserInfoDto implements Serializable {
@ExcelProperty(value = "登录来源") @ExcelProperty(value = "登录来源")
private Integer source; private Integer source;
/**
* vip用户手机
*/
@ApiModelProperty(value = "vip用户手机", name = "vipMobile")
@ExcelProperty(value = "vip用户手机")
private String vipMobile;
/** /**
* 手机 * 手机
*/ */
......
...@@ -2,6 +2,7 @@ package cn.wisenergy.service.app; ...@@ -2,6 +2,7 @@ package cn.wisenergy.service.app;
import cn.wisenergy.common.utils.R; import cn.wisenergy.common.utils.R;
import cn.wisenergy.model.app.Local; import cn.wisenergy.model.app.Local;
import cn.wisenergy.model.dto.StaffAddDto;
import cn.wisenergy.model.dto.UserInfoDto; import cn.wisenergy.model.dto.UserInfoDto;
import cn.wisenergy.model.vo.*; import cn.wisenergy.model.vo.*;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
...@@ -28,12 +29,10 @@ public interface StaffUserVipService { ...@@ -28,12 +29,10 @@ public interface StaffUserVipService {
/** /**
* 添加员工和vip客户关系 * 添vip客户
* @param staffId 员工id
* @param phone 手机号
* @return true:成功 false:失败 * @return true:成功 false:失败
*/ */
R<Boolean> addUserByPhone(Integer staffId,String phone); R<Boolean> addVipUser(StaffAddDto staffAddDto);
/** /**
* 获取地区列表 * 获取地区列表
......
...@@ -248,9 +248,9 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp ...@@ -248,9 +248,9 @@ public class SchemeServiceImpl extends ServiceImpl<SchemeMapper, SchemeInfo> imp
SetQueryTime(result); SetQueryTime(result);
volunteerVo.setVolunteers(result); volunteerVo.setVolunteers(result);
List<Volunteer> volunteers = volunteerVo.getVolunteers(); List<Volunteer> volunteers = volunteerVo.getVolunteers();
//除本科文化以外,其余最低位次用--代替 //为空的最低位次用--代替
for (Volunteer info : volunteers) { for (Volunteer info : volunteers) {
if (info.getType()!= SchemeTypeEnums.UNDERGRADUATE_CULTURE.getCode()) { if (null == info.getLowestRank()) {
info.setLowestRank("--"); info.setLowestRank("--");
} }
} }
......
...@@ -5,6 +5,7 @@ import cn.wisenergy.common.utils.R; ...@@ -5,6 +5,7 @@ import cn.wisenergy.common.utils.R;
import cn.wisenergy.common.utils.StringUtil; import cn.wisenergy.common.utils.StringUtil;
import cn.wisenergy.mapper.*; import cn.wisenergy.mapper.*;
import cn.wisenergy.model.app.*; import cn.wisenergy.model.app.*;
import cn.wisenergy.model.dto.StaffAddDto;
import cn.wisenergy.model.dto.UserCommitDto; import cn.wisenergy.model.dto.UserCommitDto;
import cn.wisenergy.model.dto.UserDto; import cn.wisenergy.model.dto.UserDto;
import cn.wisenergy.model.dto.UserInfoDto; import cn.wisenergy.model.dto.UserInfoDto;
...@@ -69,7 +70,7 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp ...@@ -69,7 +70,7 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp
@Autowired @Autowired
private LocalMapper localMapper; private LocalMapper localMapper;
private static final int ERROR_CODE = 1;
//初始密码 //初始密码
private static final String PASSWORD = "123456"; private static final String PASSWORD = "123456";
...@@ -102,7 +103,7 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp ...@@ -102,7 +103,7 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp
Subject subject = SecurityUtils.getSubject(); Subject subject = SecurityUtils.getSubject();
String credentialsSalt = Md5Util.digestMD5(loginVo.getPassword() ); String credentialsSalt = Md5Util.digestMD5(loginVo.getPassword() );
UserToken userToken = new UserToken(loginVo.getLoginName(), credentialsSalt, STAFF_LOGIN_TYPE); UserToken userToken = new UserToken(loginVo.getLoginName(), credentialsSalt, STAFF_LOGIN_TYPE);
//UsernamePasswordToken token = new UsernamePasswordToken(loginVo.getLoginName(), credentialsSalt,"staff");
try { try {
subject.login(userToken); subject.login(userToken);
QueryWrapper<Staff> objectQueryWrapper = new QueryWrapper<>(); QueryWrapper<Staff> objectQueryWrapper = new QueryWrapper<>();
...@@ -231,11 +232,41 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp ...@@ -231,11 +232,41 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp
return R.ok(info); return R.ok(info);
} }
@Transactional
@Override @Override
public R<Boolean> addUserByPhone(Integer staffId, String phone) { public R<Boolean> addVipUser(StaffAddDto staffAddDto) {
log.info("StaffUserVipServiceImpl[].addUserByPhone[].input.param:" +staffId,phone); log.info("StaffUserVipServiceImpl[].addUserByPhone[].input.param:" +staffAddDto);
if(null ==staffAddDto){
return addPhone(staffId,phone); return R.error("入参为空");
}
if(!getUserInfo(staffAddDto.getVipMobile())){
return R.error("该电话已存在");
}
User user = new User();
user.setIsVip(1);
user.setSchool(staffAddDto.getSchool());
user.setSex(staffAddDto.getSex());
user.setExamType(staffAddDto.getStudentType());
user.setIsDelete(0);
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
user.setUserName(staffAddDto.getUserName());
user.setVipMobile(staffAddDto.getVipMobile());
usersMapper.insert(user);
R<Boolean> checkScore = volunteerManager.checkScore(staffAddDto.getScoreInfo());
if (null != checkScore && checkScore.getCode() == ERROR_CODE) {
return R.error(checkScore.getMessage());
}
ScoreInfo scoreInfo = staffAddDto.getScoreInfo();
scoreInfo.setCreateTime(new Date());
scoreInfo.setUserId(user.getId());
scoreInfo.setUpdateTime(new Date());
int insert = scoreInfoMapper.insert(scoreInfo);
if(insert>0){
return R.ok(0,true);
}
return R.error("添加失败");
} }
@Override @Override
...@@ -245,7 +276,6 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp ...@@ -245,7 +276,6 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp
if (CollectionUtils.isEmpty(list)) { if (CollectionUtils.isEmpty(list)) {
return R.error("入参为空"); return R.error("入参为空");
} }
return R.ok(0,list); return R.ok(0,list);
} }
...@@ -275,23 +305,15 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp ...@@ -275,23 +305,15 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp
} }
private R<Boolean> addPhone(Integer staffId,String phone){
if (null==staffId|| StringUtils.isBlank(phone)) {
return R.error("入参为空");
}
//进行vip客户和员工绑定
User byPhone =userVipManager.checkPhone(phone);
if (null==byPhone) {
return R.error("信息添加失败");
}
R<Boolean> booleanR = userVipManager.addPhone1(staffId, byPhone);
//判断数据是否添加成功 public boolean getUserInfo(String vipMobile){
if (booleanR.getCode()!=0) { QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
return R.error("关系绑定失败"); objectQueryWrapper.eq("vip_mobile",vipMobile);
User user = usersMapper.selectOne(objectQueryWrapper);
if(null == user){
return true;
} }
return false;
return R.ok(0,true);
} }
@Override @Override
...@@ -326,7 +348,7 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp ...@@ -326,7 +348,7 @@ public class StaffUserVipServiceImpl extends ServiceImpl<LocalMapper, Local> imp
.registerTime(t.getRegisterTime()) .registerTime(t.getRegisterTime())
.source(t.getSource()==1?"PC":"APP") .source(t.getSource()==1?"PC":"APP")
.userName(t.getUserName()) .userName(t.getUserName())
.phone(t.getPhone()) .vipMobile(t.getVipMobile())
.lastLoginTime(t.getLastLoginTime()) .lastLoginTime(t.getLastLoginTime())
.school(t.getSchool()) .school(t.getSchool())
.examType(t.getExamType()==1?"文化生":t.getExamType()==2?"美术生":t.getExamType()==3?"体育生":"文学编导考生") .examType(t.getExamType()==1?"文化生":t.getExamType()==2?"美术生":t.getExamType()==3?"体育生":"文学编导考生")
......
...@@ -2,6 +2,7 @@ package cn.wisenergy.web.admin.controller.app; ...@@ -2,6 +2,7 @@ package cn.wisenergy.web.admin.controller.app;
import cn.wisenergy.common.utils.R; import cn.wisenergy.common.utils.R;
import cn.wisenergy.model.app.Local; import cn.wisenergy.model.app.Local;
import cn.wisenergy.model.dto.StaffAddDto;
import cn.wisenergy.model.dto.UserInfoDto; import cn.wisenergy.model.dto.UserInfoDto;
import cn.wisenergy.model.vo.*; import cn.wisenergy.model.vo.*;
import cn.wisenergy.service.app.SchemeService; import cn.wisenergy.service.app.SchemeService;
...@@ -35,17 +36,13 @@ public class StaffUserVipController { ...@@ -35,17 +36,13 @@ public class StaffUserVipController {
return staffUserVipService.staffLogin(loginVo); return staffUserVipService.staffLogin(loginVo);
} }
@ApiOperation(value = "添加Vip客户(当客户已存在时)",notes = "添加Vip客户(当客户已存在时)",httpMethod = "POST") @ApiOperation(value = "添加Vip客户",notes = "添加Vip客户",httpMethod = "POST")
@ApiImplicitParams({ @ApiModelProperty(name = "staffAddDto",value = "登录信息",dataType = "StaffAddDto")
@ApiImplicitParam(name = "staffId", value = "员工id", dataType = "int"), @PostMapping("/addVipUser")
@ApiImplicitParam(name = "phone", value = "vip客户手机号", dataType = "string") public R<Boolean> addVipUser(@RequestBody StaffAddDto staffAddDto){
} log.info("StaffUserVipController[].addUserVipByPhone[].input.param:"+staffAddDto);
)
@PostMapping("/add2")
public R<Boolean> addUserVipByPhone(Integer staffId, String phone){
log.info("StaffUserVipController[].addUserVipByPhone[].input.param:"+staffId,phone);
return staffUserVipService.addUserByPhone(staffId,phone); return staffUserVipService.addVipUser(staffAddDto);
} }
@ApiOperation(value = "查询Vip客户(查询所有vip客户就不用传staffId)",notes = "查询Vip客户(查询所有vip客户就不用传staffId)",httpMethod = "POST") @ApiOperation(value = "查询Vip客户(查询所有vip客户就不用传staffId)",notes = "查询Vip客户(查询所有vip客户就不用传staffId)",httpMethod = "POST")
......
package cn.wisenergy.web.shir.config; package cn.wisenergy.web.shir.config;
import cn.wisenergy.web.shir.cache.MySessionManager; import cn.wisenergy.web.shir.cache.MySessionManager;
import cn.wisenergy.web.shir.filter.AuthenticationFilter;
import cn.wisenergy.web.shir.filter.KickoutSessionControlFilter; import cn.wisenergy.web.shir.filter.KickoutSessionControlFilter;
import cn.wisenergy.web.shir.realm.AdminRealm; import cn.wisenergy.web.shir.realm.AdminRealm;
import cn.wisenergy.web.shir.realm.CodeRealm; import cn.wisenergy.web.shir.realm.CodeRealm;
...@@ -67,13 +68,14 @@ public class ShiroConfig { ...@@ -67,13 +68,14 @@ public class ShiroConfig {
//自定义拦截器 //自定义拦截器
Map<String, Filter> filtersMap = new LinkedHashMap<>(); Map<String, Filter> filtersMap = new LinkedHashMap<>();
filtersMap.put("authc", new AuthenticationFilter());
filtersMap.put("kickout",kickoutSessionControlFilter()); filtersMap.put("kickout",kickoutSessionControlFilter());
shiroFilterFactoryBean.setFilters(filtersMap); shiroFilterFactoryBean.setFilters(filtersMap);
filterChainDefinitionMap.put("/authInformation/save", "anon");//存储设备IMEI号和手机SIM卡ID号 filterChainDefinitionMap.put("/authInformation/save", "anon");//存储设备IMEI号和手机SIM卡ID号
filterChainDefinitionMap.put("/user/login/*", "anon"); // 登录页面-身份认证 filterChainDefinitionMap.put("/user/login/*", "anon"); // 登录页面-身份认证
filterChainDefinitionMap.put("/account/login", "anon"); // 登录页面-身份认证 filterChainDefinitionMap.put("/account/login", "anon"); // 登录页面-身份认证
filterChainDefinitionMap.put("/staff/staffUser", "anon"); // 登录页面-身份认证 filterChainDefinitionMap.put("/staffUser/login", "anon"); // 登录页面-身份认证
filterChainDefinitionMap.put("/swagger-ui.html", "anon"); // swagger接口-匿名访问 filterChainDefinitionMap.put("/swagger-ui.html", "anon"); // swagger接口-匿名访问
filterChainDefinitionMap.put("/swagger/**", "anon"); filterChainDefinitionMap.put("/swagger/**", "anon");
filterChainDefinitionMap.put("/admin/anon/**", "anon"); filterChainDefinitionMap.put("/admin/anon/**", "anon");
......
package cn.wisenergy.web.shir.filter;
import com.alibaba.fastjson.JSONObject;
import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.springframework.http.HttpStatus;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* 跨域配置拦截器,继承FormAuthenticationFilter
*/
public class AuthenticationFilter extends FormAuthenticationFilter {
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
// 错误异常提示
HttpServletResponse httpResponse = (HttpServletResponse) response;
HttpServletRequest httpRequest = (HttpServletRequest) request;
String sessionId = ((HttpServletRequest) request).getHeader("sessionId");
if (sessionId == null) {
setHeader(httpRequest, httpResponse);
httpResponse.setCharacterEncoding("UTF-8");
httpResponse.setContentType("application/json");
Map<String, Object> map = new HashMap<>();
map.put("status", "1001");
map.put("message", "登录已超时,请重新登录!");
httpResponse.getWriter().write(JSONObject.toJSONString(map));
return false;
} else {
return true;
}
}
/**
* 为response设置header,实现跨域
*/
private void setHeader(HttpServletRequest request, HttpServletResponse response) {
//跨域的header设置
response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", request.getMethod());
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
//防止乱码,适用于传输JSON数据
//Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild
response.setHeader("Content-Type", "application/json;charset=UTF-8");
response.setStatus(HttpStatus.OK.value());
}
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if (request instanceof HttpServletRequest) {
if (((HttpServletRequest) request).getMethod().toUpperCase().equals("OPTIONS")) {
return true;
}
}
//小程序放行
if(isFilter((HttpServletRequest) request)){
return true;
}
return super.isAccessAllowed(request, response, mappedValue);
}
//判断请求头中是否带有identity(标识是小程序)
public boolean isFilter(HttpServletRequest request) {
return null != request.getHeader("identity") && request.getHeader("identity").equals("miniprogram");
}
}
...@@ -76,14 +76,19 @@ public class KickoutSessionControlFilter extends AccessControlFilter { ...@@ -76,14 +76,19 @@ public class KickoutSessionControlFilter extends AccessControlFilter {
return true; return true;
} }
Session session = subject.getSession(); Session session = subject.getSession();
//设置session超时时长,30分钟(1800000毫秒)
//session.setTimeout(1800000);
//5分钟
session.setTimeout(300000);
Serializable sessionId = null; Serializable sessionId = null;
String username = null; String username = null;
Deque<Serializable> deque = null; Deque<Serializable> deque = null;
try { try {
//客户端 //客户端
User user = (User) SecurityUtils.getSubject().getPrincipal(); User user = (User) SecurityUtils.getSubject().getPrincipal();
username=user.getPhone(); username = user.getPhone();
sessionId = session.getId(); sessionId = session.getId();
//读取缓存,没有就存入 //读取缓存,没有就存入
deque = cache.get(username); deque = cache.get(username);
...@@ -96,31 +101,16 @@ public class KickoutSessionControlFilter extends AccessControlFilter { ...@@ -96,31 +101,16 @@ public class KickoutSessionControlFilter extends AccessControlFilter {
//读取缓存,没有就存入 //读取缓存,没有就存入
deque = cache.get(username); deque = cache.get(username);
} catch (Exception en) { } catch (Exception en) {
try {
//员工端 //员工端
Staff staff = (Staff) SecurityUtils.getSubject().getPrincipal(); Staff staff = (Staff) SecurityUtils.getSubject().getPrincipal();
username = staff.getLoginName(); username = staff.getLoginName();
sessionId = session.getId(); sessionId = session.getId();
//读取缓存,没有就存入 //读取缓存,没有就存入
deque = cache.get(username); deque = cache.get(username);
} catch (Exception es) {
map.put("status", "1001");
map.put("message", "登录已超时,请重新登录!");
out(response, map);
//退出登录
subject.logout();
return false;
} }
} }
}
//30分钟(1800000毫秒)
//session.setTimeout(1800000);
//5分钟
session.setTimeout(300000);
//如果此用户没有session队列,也就是还没有登录过,缓存中没有 //如果此用户没有session队列,也就是还没有登录过,缓存中没有,就new一个空队列,不然deque对象为空,会报空指针
//就new一个空队列,不然deque对象为空,会报空指针
if (deque == null) { if (deque == null) {
deque = new LinkedList<>(); deque = new LinkedList<>();
} }
...@@ -172,12 +162,11 @@ public class KickoutSessionControlFilter extends AccessControlFilter { ...@@ -172,12 +162,11 @@ public class KickoutSessionControlFilter extends AccessControlFilter {
return true; return true;
} }
private void out(ServletResponse hresponse, Map<String, Object> map) throws IOException { private void out(ServletResponse response, Map<String, Object> map) throws IOException {
response.setContentType("text/json");
hresponse.setContentType("text/json");
//设置字符集为'UTF-8' //设置字符集为'UTF-8'
hresponse.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
PrintWriter out = hresponse.getWriter(); PrintWriter out = response.getWriter();
out.write(JSON.toJSONString(map, SerializerFeature.WriteMapNullValue)); out.write(JSON.toJSONString(map, SerializerFeature.WriteMapNullValue));
out.flush(); out.flush();
out.close(); out.close();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment