前端参考[PHP做后端实现微信小程序登录](https://blog.csdn.net/weixin_44735933/article/details/106453785)
LoginServlet
import com.starcpdk.entity.User;
import com.starcpdk.service.LoginService;
import com.starcpdk.service.impl.LoginServiceImpl;
import net.sf.json.JSONObject;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request , response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=utf-8");
String code = request.getParameter("code");
String username = request.getParameter("username");
String faceUrl = request.getParameter("face_url");
String identify = request.getParameter("identify");
String appid = "wx3d4200f27d153872";
String secret = "33fafea3efad86cef0eb62b029ac3887";
// 连接微信换userID接口
String getOpenIdUrl = "https://api.weixin.qq.com/sns/jscode2session?appid="
+ appid + "&secret=" + secret
+ "&js_code=" + code + "&grant_type=authorization_code";
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGetOpenId = new HttpGet(getOpenIdUrl);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String token = null;
try {
token = httpClient.execute(httpGetOpenId, responseHandler);
} catch (ClientProtocolException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
JSONObject jObject = JSONObject.fromObject(token);
String userid = jObject.getString("openid");
System.out.println("=======userid======++++++userid++++++===userid========"+userid);
request.getSession().setAttribute("userid", userid);
//取到userID,判断用户是否存在
//若存在,查出用户,返回值按前端要求返回
//若不存在,新建用户,写入名称及userID
LoginService loginService = new LoginServiceImpl();
User user = loginService.selLogin(userid);
JSONObject json = new JSONObject();
PrintWriter out = response.getWriter();
if (user != null) {
request.getSession().setAttribute("userid", user.getUserId());
request.getSession().setAttribute("name", user.getUserName());
json.put("code", 1);
json.put("msg", "用户已存在");
json.put("user", user);
out.print(json);
out.close();
} else {
User user1 = new User();
user1.setUserId(userid);
user1.setUserName(username);
user1.setFaceUrl(faceUrl);
user1.setIdentify(identify);
boolean count = loginService.insLogin(user1);
if (count){
request.getSession().setAttribute("userid", user.getUserId());
request.getSession().setAttribute("name", user.getUserName());
json.put("code", 0);
json.put("user" , user1);
json.put("msg" , "注册成功,并且登录");
out.print(json);
out.close();
}else {
json.put("code", 2);
json.put("msg" , "注册失败");
out.print(json);
out.close();
}
}
}
}
LoginService
package com.starcpdk.service;
import com.starcpdk.entity.User;
public interface LoginService {
public User selLogin(String userid);
public boolean insLogin(User user);
}
LoginServiceImpl
import com.starcpdk.dao.LoginDao;
import com.starcpdk.dao.impl.LoginDaoImpl;
import com.starcpdk.entity.User;
import com.starcpdk.service.LoginService;
public class LoginServiceImpl implements LoginService {
LoginDao loginDao = new LoginDaoImpl();
@Override
public User selLogin(String userid) {
User user = loginDao.selLogin(userid);
return user;
}
@Override
public boolean insLogin(User user) {
boolean count = loginDao.insLogin(user);
return count;
}
}
LoginDao
import com.starcpdk.entity.User;
public interface LoginDao {
public User selLogin(String userid);
public boolean insLogin(User user);
}
LoginDaoImpl
import com.starcpdk.dao.LoginDao;
import com.starcpdk.entity.User;
import com.starcpdk.util.DBUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
public class LoginDaoImpl implements LoginDao {
@Override
public User selLogin(String userid) {
String sql = "select * from user where userid = ?";
Object[] params = new Object[]{userid};
ResultSet rs = DBUtil.executeQuery(sql, params);
User user = new User();
System.out.println("上边的user值"+user);
if (rs != null){
try {
while (rs.next()) {
user.setId(rs.getInt("id"));
user.setUserId(rs.getString("userid"));
user.setUserName(rs.getString("username"));
user.setPhone(rs.getString("phone"));
user.setFaceUrl(rs.getString("face_url"));
user.setIdentify(rs.getString("identify"));
return user;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
return null;
}
@Override
public boolean insLogin(User user) {
// TODO Auto-generated method stub
String sql;
Object[] params;
System.out.println(user.getUserId()+user.getUserName());
params = new Object[] {user.getUserId() , user.getUserName() , user.getPhone() , user.getFaceUrl() , user.getIdentify()};
sql = "insert into user (userid , username , phone , face_url , identify) values(? , ? , ? , ? , ?) ";
System.out.println(params);
boolean result = DBUtil.excuteUpdate(sql, params);
return result;
}
}
连接池工具类
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
import java.io.InputStream;
import java.util.Properties;
public class DataSourceUtil {
//c3p0 硬编码的方式
public static DataSource getDataSourceWithC3P0(){
ComboPooledDataSource c3p0 = new ComboPooledDataSource();
try {
c3p0.setDriverClass("com.mysql.cj.jdbc.Driver");
} catch (PropertyVetoException e) {
e.printStackTrace();
}
c3p0.setJdbcUrl("jdbc:mysql://localhost:3306/pms?serverTimezone=UTC");
c3p0.setUser("root");
c3p0.setPassword("root");
// c3p0.setPassword("123456");
return c3p0 ;
}
// c3p0 的xml方式获取dataSource
public static DataSource getDataSourceWithC3P0ByXml(){
ComboPooledDataSource c3p0 = new ComboPooledDataSource("yyf");
return c3p0 ;
}
// 获取dbcp方式的ds对象,方式一:BasicDataSource
public static DataSource getDataSourceWIthDBCP(){
BasicDataSource dbcp = new BasicDataSource();
dbcp.setDriverClassName("com.mysql.cj.jdbc.Driver");
dbcp.setUrl("jdbc:mysql://localhost:3306/test1?serverTimezone=UTC");
dbcp.setUsername("root");
dbcp.setPassword("123456");
dbcp.setInitialSize(20);
dbcp.setMaxActive(10);
return dbcp;
}
// 获取dbcp方式的ds对象,方式二:BasicDataSource, Properties
public static DataSource getDataSourceWIthDBCPByProperties() throws Exception {
DataSource dbcp = null;
Properties props = new Properties();
// 将 dbcpconfig.properties 文件加载到此类中
// 将字符串 "dbcpconfig.properties" 转换为 输入流
InputStream input = new DBCPDemo().getClass().getClassLoader().getResourceAsStream("dbcpconfig.properties");
//load方法中参数没有直接为字符串的,需要一个流的形式
props.load(input);
// BasicDataSourceFactory 的返回值为DataSource 从dbcpconfig.properties文件中取到数据:
// driverClassName = com.mysql.cj.jdbc.Driver
//url = jdbc:mysql://localhost:3306/test1?serverTimezone=UTC
//username = root
//password = 123456
//initialSize = 20
dbcp = BasicDataSourceFactory.createDataSource(props);
return dbcp;
}
}
操作数据库类
import javax.sql.DataSource;
import java.sql.*;
public class DBUtil {
private static final String URL = "jdbc:mysql://39.102.36.78:3306/test1";
private static final String USERNAME = "test1";
private static final String PWD = "123456";
public static Connection conn = null;
public static Statement st = null;
public static PreparedStatement ps = null;
public static ResultSet rs = null;
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
//return DriverManager.getConnection(URL,USERNAME,PWD);
Connection con = null;
DataSource ds= DataSourceUtil.getDataSourceWithC3P0();
con = ds.getConnection();
return con;
}
public static PreparedStatement createPreparedStatement(String sql, Object[] params) throws SQLException, ClassNotFoundException {
ps = getConnection().prepareStatement(sql);
if(params!=null) {
for(int i=0;i<params.length;i++) {
ps.setObject(i+1, params[i]);
}
}
return ps;
}
public static void closeAll(ResultSet rs, Statement ps, Connection conn) {
try {
if(rs != null)rs.close();
if(ps != null)ps.close();
if(conn != null)conn.close();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//增删改
public static boolean excuteUpdate(String sql, Object[] params) {
try {
ps = createPreparedStatement(sql, params);
int count = ps.executeUpdate();
if(count>0) {
return true;
}else {
return false;
}
} catch (SQLException e) {
e.printStackTrace();
return false;
}catch (Exception e) {
e.printStackTrace();
return false;
}
finally {
closeAll(null, ps, conn);
}
}
//查
public static ResultSet executeQuery(String sql, Object[] params) {
try {
ps = createPreparedStatement(sql, params);
rs = ps.executeQuery();
return rs;
} catch (SQLException e) {
e.printStackTrace();
return null;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static int getTotalCount(String sql) {
int count = -1;
try {
ps = createPreparedStatement(sql, null);
rs = ps.executeQuery();
if(rs.next()) {
count = rs.getInt(1);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally {
closeAll(rs, ps, conn);
}
return count;
}
}
配置文件c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!-- 如果要研究某个xml中可以设置哪些属性。找相关类的 属性 或者setXxx()-->
<property name="user">root</property>
<property name="password">123456</property>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test1?serverTimezone=UTC</property>
<property name="checkoutTimeout">30000</property>
</default-config>
<named-config name="yyf">
<property name="user">root</property>
<property name="password">123456</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/pms?serverTimezone=UTC</property>
<property name="checkoutTimeout">20000</property>
</named-config>
</c3p0-config>
配置文件数据库信息dbcpconfig.properties
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/test1?serverTimezone=UTC
username = root
password = 123456
initialSize = 20